import NativeHelper from "../comm/NativeHelper";
import TDCtrl from "../ctrl/TDCtrl";
import { GameConfig } from "../data/GameConfig";
import LocalValues from "../data/LocalValues";
import { EventMgr } from "../manager/EventMgr";
import { EventName } from "../manager/EventMgr";
import MyFetch from "./MyFetch";

export class EventReport {
    private static eventReportUrl: string = 'http://bi.triwingames.com/api/eventReport';
    private static uid: string = '';
    private static apiKey: string = '';
    private static adjustId: string = '';
    private static reportQueue: {event: EventReportName, data?: BaseEventReportData}[] = [];
    public static init(uid: string, apiKey: string, adjustId: string) {
        console.log('### EventReport init', uid, apiKey, adjustId);
        this.uid = uid;
        this.apiKey = apiKey;
        this.adjustId = adjustId;
        EventMgr.on(EventName.onNetState, this.onNetState, this);
        if (!adjustId) {
            EventMgr.on(EventName.onAdjustAdid, this.onAdjustAdid, this);
            setTimeout(() => {
                this.adjustId = this.adjustId || 'unknown';
            }, 20 * 1000);
        }
        this.loadReportQueue();
    }
    private static onAdjustAdid(adjustId: string) {
        console.log('### EventReport onAdjustAdid', adjustId);
        this.adjustId = adjustId;
    }
    private static onNetState(netState: boolean) {
        console.log('### EventReport onNetState', netState);
        if (netState) {
            this.next();
        }
    }
    public static get isInit() {
        return this.uid && this.apiKey && this.adjustId && NativeHelper.netState;
    }
    //========上报api========
    // 启动应用
    public static async app_open() {
        return await this.report(EventReportName.app_open);
    }
    // 首次启动应用
    public static async app_first_open() {
        return await this.report(EventReportName.app_first_open);
    }
    // 本地资源检查
    public static async local_resource_check_start() {
        return await this.report(EventReportName.local_resource_check_start);
    }
    // 本地资源检查完成
    public static async local_resource_check_complete() {
        return await this.report(EventReportName.local_resource_check_complete);
    }
    // 热更资源检查
    public static async hot_update_check_start() {
        return await this.report(EventReportName.hot_update_check_start);
    }
    // 热更资源检查完成
    public static async hot_update_check_complete() {
        return await this.report(EventReportName.hot_update_check_complete);
    }
    // 加载登录资源
    public static async load_login_data_start() {
        return await this.report(EventReportName.load_login_data_start);
    }
    // 加载登录资源完成
    public static async load_login_data_complete() {
        return await this.report(EventReportName.load_login_data_complete);
    }
    // 自动登录准备工作开始
    public static async pre_autologin_start() {
        return await this.report(EventReportName.pre_autologin_start);
    }
    // 自动登录准备工作完成
    public static async pre_autologin_complete() {
        return await this.report(EventReportName.pre_autologin_complete);
    }
    // 登录方式选择
    public static async click_login(data: ReportDataClickLogin) {
        return await this.report(EventReportName.click_login, data);
    }
    // 注册
    public static async register(data: ReportDataRegister) {
        return await this.report(EventReportName.register, data);
    }
    // 登录
    public static async login(data: ReportDataLogin) {
        return await this.report(EventReportName.login, data);
    }
    // 开始游戏关卡
    public static async level_play(data: ReportDataLevelPlay) {
        return await this.report(EventReportName.level_play, data);
    }
    // 完成游戏关卡
    public static async level_completed(data: ReportDataLevelComplete) {
        return await this.report(EventReportName.level_completed, data);
    }
    // 游戏关卡失败
    public static async level_failed(data: ReportDataLevelFailed) {
        return await this.report(EventReportName.level_failed, data);
    }
    // 打开页面
    public static async open_view(data: ReportDataOpenView) {
        return await this.report(EventReportName.open_view, data);
    }
    // 进入大厅
    public static async enter_lobby(data: ReportDataEnterLobby) {
        return await this.report(EventReportName.enter_lobby, data);
    }
    // 关闭页面
    public static async close_view(data: ReportDataCloseView) {
        return await this.report(EventReportName.close_view, data);
    }
    // 游戏声音
    public static async game_sound(data: ReportDataGameSound) {
        return await this.report(EventReportName.game_sound, data);
    }
    // 广告点击
    public static async adClick(data: ReportDataAdClick) {
        return await this.report(EventReportName.adClick, data);
    }
    // 广告加载失败
    public static async ad_pull_failed(data: ReportDataAdPullFailed) {
        return await this.report(EventReportName.ad_pull_failed, data);
    }
    // 广告加载开始
    public static async ad_pull_start(data: ReportDataAdPullStart) {
        return await this.report(EventReportName.ad_pull_start, data);
    }
    // 广告加载成功
    public static async ad_pull_success(data: ReportDataAdPullSuccess) {
        return await this.report(EventReportName.ad_pull_success, data);
    }
    // 广告展示
    public static async ad_show(data: ReportDataAdShow) {
        return await this.report(EventReportName.ad_show, data);
    }
    // 获取广告奖励
    public static async ad_view_rewards_collect(data: ReportDataAdViewRewardsCollect) {
        return await this.report(EventReportName.ad_view_rewards_collect, data);
    }
    public static async ad_type_change(data: ReportDataAdTypeChange) {
        return await this.report(EventReportName.ad_type_change, data);
    }
    // 取消购买
    public static async purchase_cancel(data: ReportDataPurchaseCancel) {
        return await this.report(EventReportName.purchase_cancel, data);
    }
    // 点击购买
    public static async purchase_click(data: ReportDataPurchaseClick) {
        return await this.report(EventReportName.purchase_click, data);
    }
    // 主动点击付费入口
    public static async purchase_click_client(data: ReportDataPurchaseClickClient) {
        return await this.report(EventReportName.purchase_click_client, data);
    }
    // 购买失败
    public static async purchase_failed(data: ReportDataPurchaseFailed) {
        return await this.report(EventReportName.purchase_failed, data);
    }
    // 付费购买
    public static async recharge(data: ReportDataRecharge) {
        return await this.report(EventReportName.recharge, data);
    }
    // 安装首次加载插屏成功
    public static async first_fill_ad_info_i(data: ReportDataFirstFillAdInfoI) {
        return await this.report(EventReportName.first_fill_ad_info_i, data);
    }
    // 安装首次加载激励成功
    public static async first_fill_ad_info_v(data: ReportDataFirstFillAdInfoV) {
        return await this.report(EventReportName.first_fill_ad_info_v, data);
    }
    // 七日签到奖励
    public static async seven_days_login_gift(data: ReportData7DaysLoginGift) {
        return await this.report(EventReportName.seven_days_login_gift, data);
    }
    // 幸运转盘
    public static async lucky_spin(data: ReportDataLuckySpin) {
        return await this.report(EventReportName.lucky_spin, data);
    }
    // 挂机礼包
    public static async countdown_gift(data: ReportDataCountdownGift) {
        return await this.report(EventReportName.countdown_gift, data);
    }
    // 评分弹窗推送
    public static async rate_us_push(data: ReportDataRateUsPush) {
        return await this.report(EventReportName.rate_us_push, data);
    }
    // 评分弹窗点击
    public static async rate_us_record(data: ReportDataRateUsRecord) {
        return await this.report(EventReportName.rate_us_record, data);
    }
    // 通知权限获取
    public static async notification_authority(data: ReportDataNotificationAuthority) {
        return await this.report(EventReportName.notification_authority, data);
    }
    // 变量被使用
    public static async ab_param_use(data: ReportDataAbParamUse) {
        return await this.report(EventReportName.ab_param_use, data);
    }
    // 分配变量
    public static async ab_test_assign(data: ReportDataAbTestAssign) {
        return await this.report(EventReportName.ab_test_assign, data);
    }
    // 拉取变量
    public static async pull_ab_param(data: ReportDataPullAbParam) {
        return await this.report(EventReportName.pull_ab_param, data);
    }
    // 获取推送变量
    public static async push_ab_param(data: ReportDataPushAbParam) {
        return await this.report(EventReportName.push_ab_param, data);
    }
    // 点击弹窗/界面icon
    public static async click_view(data: ReportDataClickView) {
        return await this.report(EventReportName.click_view, data);
    }
    //=======================
    public static async report(event: EventReportName, data?: BaseEventReportData) {
        this.reportQueue.push({event, data});
        this.next();
        this.saveReportQueue();
    }
    private static saveReportQueue() {
        clearTimeout(this['saveReportQueueTimer']);
        this['saveReportQueueTimer'] = setTimeout(() => {
            const arr = [...this.reportQueue];
            arr.length = Math.min(arr.length, 30); // 仅保存30条
            LocalValues.setString('reportQueue', JSON.stringify(arr));
        }, 1);
    }
    private static loadReportQueue() {
        const reportQueue = LocalValues.getString('reportQueue');
        if (reportQueue) {
            this.reportQueue = JSON.parse(reportQueue);
        }
    }
    private static bRunning: boolean = false;
    private static async next() {
        if (this.bRunning) {
            return;
        }
        const item = this.reportQueue.shift();
        if (item) {
            try {
                this.bRunning = true;
                let {event, data} = item;
                data = data || {};
                data.appsflyerID = this.adjustId == 'unknown' ? '' : this.adjustId;
                data.version = GameConfig.version;
                const reportData: IEventReport = {
                    apiKey: this.apiKey,
                    uid: this.uid,
                    event,
                    data
                }
                // console.log('EventReport request', item);
                const result = await this.request(reportData);
                // console.log('EventReport request result', result);
                if (result == 0) {
                    this.bRunning = false;
                    this.next();
                    TDCtrl.instance.onEventReport(event);
                    this.saveReportQueue();
                } else if (result == -1 || result == 999999) {
                    if (this.reportQueue.length < 50) { // 失败的上报，如果队列小于50条，则将失败的上报插入队列尾部
                        this.reportQueue.push(item);
                    }
                    if (!NativeHelper.netState) {
                        this.bRunning = false;
                    } else {
                        setTimeout(() => {
                            this.bRunning = false;
                            this.next();
                        }, 3 * 1000);
                    }
                } else {
                    if (event == EventReportName.register && result == 1) {
                        console.log('重复注册');
                    } else {
                        console.error('### EventReport request error, event:' + item.event + ', code:' + result);
                    }
                    this.bRunning = false;
                    this.next();
                }
            } catch (error) {
                console.error('### EventReport request error, event:' + item.event + ', error:' + error);
                setTimeout(() => {
                    this.bRunning = false;
                    this.next();
                }, 3 * 1000);
                
            }
        } else {
            this.bRunning = false;
        }
    }
    private static async request(reportData: IEventReport) {
        if (!this.isInit) {
            return -1;
        }
        try {
            console.log('[EventReport] request', reportData.event, reportData.data);
            let res:any = null;
            if (NativeHelper.isNative) {
                res = await MyFetch.postExternal(this.eventReportUrl, reportData);
            } else {
                res = {code: 0};
            }
            // console.log('[EventReport] response', res);
            if (res.code === 0) {
                return 0;
            } else {
                // console.error('### EventReport request error, event:' + reportData.event + ', code:' + res.code);
                // console.error(JSON.stringify(res));
                return <number>res.code;
            }
        } catch (e) {
            return 999999;
        }
    }
}

export interface IEventReport {
    apiKey: string;
    uid: string;
    event: EventReportName;
    data: any;
}

export enum EventReportName {
    //==以下都是base，不需要声明接口==
    app_open = 'app_open', // 启动应用
    app_first_open = 'app_first_open', // 首次启动应用
    local_resource_check_start = 'local_resource_check_start', // 本地资源检查
    local_resource_check_complete = 'local_resource_check_complete', // 本地资源检查完成
    hot_update_check_start = 'hot_update_check_start', // 热更资源检查
    hot_update_check_complete = 'hot_update_check_complete', // 热更资源检查完成
    load_login_data_start = 'load_login_data_start', // 加载登录资源
    load_login_data_complete = 'load_login_data_complete', // 加载登录资源完成
    pre_autologin_start = 'pre_autologin_start', // 自动登录准备工作开始
    pre_autologin_complete = 'pre_autologin_complete', // 自动登录准备工作完成
    //==以下都需要继承BaseEventReportData==
    click_login = 'click_login', // 登录方式选择
    register = 'register', // 注册
    login = 'login', // 登录
    level_play = 'level_play', // 开始游戏关卡
    level_completed = 'level_completed', // 完成游戏关卡
    level_failed = 'level_failed', // 游戏关卡失败
    open_view = 'open_view', // 打开页面
    enter_lobby = 'enter_lobby', // 进入大厅
    close_view = 'close_view', // 关闭页面
    game_sound = 'game_sound', // 玩家手动点击音乐、音效按钮时上报
    //==03.31==
    adClick = 'adClick', // 广告点击
    ad_pull_failed = 'ad_pull_failed', // 广告加载失败
    ad_pull_start = 'ad_pull_start', // 请求广告加载
    ad_pull_success = 'ad_pull_success', // 广告加载成功
    ad_show = 'ad_show', // 激励广告点位展示
    ad_view_rewards_collect = 'ad_view_rewards_collect', // 获取广告奖励
    purchase_cancel = 'purchase_cancel', // 取消购买
    purchase_click = 'purchase_click', // 点击购买
    purchase_click_client = 'purchase_click_client', // 主动点击付费入口
    purchase_failed = 'purchase_failed', // 购买失败
    recharge = 'recharge', // 付费购买
    first_fill_ad_info_i = 'first_fill_ad_info_i', // 安装首次加载插屏成功
    first_fill_ad_info_v = 'first_fill_ad_info_v', // 安装首次加载激励成功
    seven_days_login_gift = '7days_login_gift', // 七日签到奖励
    lucky_spin = 'lucky_spin', // 幸运转盘
    countdown_gift = 'countdown_gift', // 挂机礼包
    //==1.0.9
    rate_us_push = 'rate_us_push', // 评分弹窗推送
    rate_us_record = 'rate_us_record', // 评分弹窗点击
    notification_authority = 'notification_authority', // 通知权限获取
    ab_param_use = 'ab_param_use', // 变量被使用
    ab_test_assign = 'ab_test_assign', // 分配变量
    pull_ab_param = 'pull_ab_param', // 拉取变量
    push_ab_param = 'push_ab_param', // 获取推送变量
    ad_type_change = 'ad_type_change', // 广告替换事件
    click_view = 'click_view', // 点击弹窗/界面icon
}

//==============<枚举==============
export enum AdPos {
    none = '', // 无
}
export enum AdType {
    interstitial = 'interstitial', // 插屏
    rewarded = 'rewarded', // 激励
    banner = 'banner', // 横幅
}
//==============枚举>==============
export interface BaseEventReportData {
    appsflyerID?: string; // adjustId
    version?: string; // 版本号
}
export interface ReportDataClickLogin extends BaseEventReportData {
    loginType: string; // 登录方式	字符串 目前无登录方式选择，无需上报
}
export interface ReportDataRegister extends BaseEventReportData {
    uType: string; // 用户类型	字符串	游客：Guest；FB：Facebook；APPLE：apple
    username: string; // 用户名	字符串	没有则置空
    fbid: string; // FB用户的openid	字符串	非facebook账号置空
    email: string; // 用户邮箱	字符串	没有邮箱则置空
    deviceToken: string; // FCM token	字符串	firebase获取，推送使用
    balance: { // 资产余额	对象组	初始资源余额
        type: string; // 资源类型	字符串	资源类型：金币：coins
        count: number; // 资源数量	数值	
    }[];
    idfa: string; // 广告追踪id	字符串	安卓上取GAID
    localTime: string; // 用户启动游戏时设备所记录的时间	字符串	上报时分秒的字符串
    cpuInfo: string; // 处理器名称	字符串	如：Snapdragon888plus
    gpuInfo: string; // GPU信息	字符串	上报json{renderer:ARM,vender:mail-G67}renderer	渲染器vender	供应商
    ramInfo: {
        occupied: number; // 占用运存	数值	单位GB
        total: number; // 总运存	数值	单位GB
    }
    romInfo: {
        occupied: number; // 占用容量	数值	单位GB
        total: number; // 总容量	数值	单位GB
    }
    systemInfo: string; // 操作系统名称	字符串	如：Android9
    network: string; // 上网方式	字符串	上报用户通过什么内容上网，如：WiFi，3G，4G，5G
    conversationData: string; // conversationData	字符串	从adjustSDK获取到的conversationData
    ip: string; // 用户IP	字符串	
}
export interface ReportDataLogin extends BaseEventReportData {
    fbid: string; // FB用户的openid	字符串	非facebook账号置空
    email: string; // 用户邮箱	字符串	没有邮箱则置空
    deviceToken: string; // FCM token	字符串	firebase获取，推送使用
    level: number; // 用户等级	数值	当前等级
    ip: string; // 用户IP	字符串	
}
export interface ReportDataLevelPlay extends BaseEventReportData {
    level: number; // 玩家等级	数值	
    layoutID: number; // 关卡ID	数值	
    difficulty: number; // 关卡难度	数值	
    isBoosterChoose: boolean; // 是否选择场外道具	布尔	true：是 false：否
    boosterChoose: { // 场外道具选择信息
        type: string; // 场外道具选择类型	字符串	道具1：crutch；道具2：windmill；道具3：joker
        count: number; // 场外道具选择数量	数值	
    }[];
    isCardCollection: boolean; // 是否参与收集活动
}
export interface ReportDataLevelComplete extends BaseEventReportData {
    level: number; // 玩家等级	数值	
    layoutID: number; // 关卡ID	数值	
    difficulty: number; // 关卡难度	数值	
    balance: { // 当前资源余额	对象组	
        type: string; // 资源类型	字符串	资源类型：金币：coins
        // ；局外小丑牌：booster_joker
        count: number; // 资源数量	数值	
    }[];
    propUse: { // 使用道具情况	对象组	
        type: string; // 使用道具类型	字符串	撤销：undo；局内小丑牌：prop_joker；加牌：addcard；
        count: number; // 使用道具数量	数值	
    }[];
    isBoosterChoose: boolean; // 本关是否选择场外道具	布尔	true：是 false：否
    /* 如选择道具1，没选道具2、3，上报：perfume,1;slot,0;booster_joker,0
     * 如选择道具2，没选道具1,3，上报：perfume,0;slot,1;booster_joker0
     * 如选择道具3，没选道具1,2，上报：perfume,0;slot,0;booster_joker,1
     * 如选择道具1,2，没选道具3，上报：perfume,1;slot,1;booster_joker,0
     * 如选择道具1,3，没选道具2，上报：perfume,1;slot,0;booster_joker,1
     * 如选择道具2,3，没选道具1，上报：perfume,0;slot,1;booster_joker,1
     * 如选择道具1,2,3上报：perfume,1;slot,1;booster_joker,1
     * 如都没选，上报：perfume,0;slot,0;booster_joker,0*/
    boosterChoose: { // 场外道具选择信息
        type: string; // 场外道具选择类型	字符串	道具1：perfume；道具2：slot；道具3：booster_joker
        count: number; // 场外道具选择数量	数值	
    }[];
    clickSuccess: number; // 点击卡牌成功次数	数值	上报玩家点击卡牌成功覆盖次数
    clickFailed: number; // 点击卡牌失败次数	数值	上报玩家点击卡牌覆盖失败次数
    comboUse: { // 连击奖励情况	对象组	
        type: string; // 连击奖励类型	字符串	道具卡：prop_joker
        count: number; // 连击奖励触发次数	数值	
    }[];
    comboTimes: number; // 连击触发次数	数值	上报玩家关卡内触发连击的总次数
    mostCombo: number; // 最大连击	数值	上报玩家关卡内最大连击次数
    cardOverage: { // 剩余库存牌情况	对象组	
        type: string; // 剩余库存牌类型	字符串	普通牌：normal；小丑牌；joker；拐杖牌：crutch；风车牌：windmill
        count: number; // 剩余库存牌数量	数值	
    }[];
    missTimes: number; // 错过接龙次数	数值	玩家错过接龙时上报
    averageExhibit: number; // 平均显示牌数	数值	平均显示牌数
    cardCollectAmount: number; // 单关收集数量	数值	
    retryTimes: number; // 玩家主动点击end games次数	数值	上报玩家关卡内主动点击end games的次数
    timeCost: number; // 关卡耗时	数值	上报玩家关卡持续时间（单位：s）
}
export interface ReportDataLevelFailed extends BaseEventReportData {
    level: number; // 玩家等级	数值	
    layoutID: number; // 关卡ID	数值	
    difficulty: number; // 关卡难度	数值	
    balance: { // 当前资源余额	对象组	
        type: string; // 资源类型	字符串	资源类型：金币：coins；局外小丑牌：booster_joker；香水牌：perfume；老虎机牌：slot；撤销：undo；局内小丑牌：prop_joker
        count: number; // 资源数量	数值	
    }[];
    propUse: { // 使用道具情况	对象组	
        type: string; // 使用道具类型	字符串	撤销：undo；小丑牌：joker；加牌：addcard；
        count: number; // 使用道具数量	数值	
    }[];
    failedReason: string; // 关卡失败原因	文本	上报玩家关卡失败原因：网络异常：Networkerror；设置界面返回大厅：Home；库存牌消耗完毕主动结束：Endgame
    gapCard: number; // 剩余待消牌数	数值	上报失败时玩家关卡完成进度：桌面剩余待消牌数量
    // isBoosterChoose	本关是否选择场外道具	布尔	true：是 false：否
    isBoosterChoose: boolean;
    boosterChoose: { // 场外道具选择信息	对象组	
        type: string; // 场外道具选择类型	字符串	道具1：perfume；道具2：slot；道具3：booster_joker
        count: number; // 场外道具选择数量	数值	
    }[];
    comboUse: { // 连击奖励	对象组	
        type: string; // 连击使用类型	字符串	金币：coins；双倍金币：doublecoins；道具卡：wildcard
        count: number; // 连击触发次数	数值	
    }[];
    comboTimes: number; // 连击触发次数	数值	上报玩家关卡内触发连击的总次数
    mostCombo: number; // 最大连击	数值	上报玩家关卡内最大连击次数
    clickSuccess: number; // 点击卡牌成功次数	数值	上报玩家点击卡牌成功覆盖次数
    clickFailed: number; // 点击卡牌失败次数	数值	上报玩家点击卡牌覆盖失败次数
    retryTimes: number; // 玩家主动点击retry次数	数值	上报玩家关卡内主动点击retry的次数
    timeCost: number; // 关卡耗时	数值	上报玩家关卡耗时（单位：s）
}
export interface ReportDataOpenView extends BaseEventReportData {
    level: number; // 玩家等级
    viewName: string; // 页面名称
}
export interface ReportDataEnterLobby extends BaseEventReportData {
    level: number; // 玩家等级
}
export interface ReportDataCloseView extends BaseEventReportData {
    level: number; // 玩家等级
    viewName: string; // 页面名称
}
export interface ReportDataGameSound extends BaseEventReportData {
    level: number; // 玩家等级
    switchType: string; // 游戏声音切换类型	字符串	音乐：music；音效：voice；震动：shock
    state: string; // 声音切换后按钮状态	字符串	打开：on；关闭：off
}

// export interface ReportDataCardcollectInfo extends BaseEventReportData {
//     level: number; // 玩家等级
//     eventId: string; // 活动ID
//     roundLevel: number; // 活动等级
//     cardCollectNum: number; // 卡片收集数量
//     cardNeedNum: number; // 本收集活动关卡剩余需求卡牌数量
// }
export interface ReportDataAdView {
    placement: {adPos: string},
    customData: {
        level: number,
        version: string,
        isTest: boolean,
        adPos: string
    },
    changeAdType?: boolean
}
export interface ReportDataAdClick extends BaseEventReportData {
    adpos: AdPos; // 广告位置
    level: number; // 玩家等级
}

export interface ReportDataAdPullFailed extends BaseEventReportData {
    adfailedreason: string; // 广告拉取失败原因
    adpos: AdPos; // 广告位置
    adtype: AdType; // 广告类型
}

export interface ReportDataAdPullStart extends BaseEventReportData {
    adpos: AdPos; // 广告位置
    adtype: AdType; // 广告类型
}

export interface ReportDataAdPullSuccess extends BaseEventReportData {
    adpos: AdPos; // 广告位置
    adtype: AdType; // 广告类型
}

export interface ReportDataAdShow extends BaseEventReportData {
    adpos: AdPos; // 广告位置
    level: number; // 玩家等级
}

export interface ReportDataAdViewRewardsCollect extends BaseEventReportData {
    adpos: AdPos; // 广告位置
    adtime: number; // 点击广告时间（时间戳）
    adtype: AdType; // 广告类型	字符串	广告类型 [rewarded | interstitial]（激励|插屏）
    rewardsdeliverstatus: string; // 广告下发状态	字符串	上报是否有奖励下发；有：Yes；无：No
}

export interface ReportDataAdTypeChange extends BaseEventReportData {
    ecpmBefore: number;
    ecpmAfter: number;
    adTypeBefore: AdType;
    adTypeAfter: AdType;
    reason: string;
}

export interface ReportDataPurchaseCancel extends BaseEventReportData {
/*
购买位置（礼包内容）
{
礼包：读表
商城金币：coins
......}
*/
    itempos: string; // 购买项位置（自定义）
/*
购买物品类型
{金币：coin
礼包：pack
去广告：removeads
......}
*/
    itemtype: string; // 购买项类型
    level: number; // 玩家等级
    price: number; // 购买价格（美元）
}

export interface ReportDataPurchaseClick extends BaseEventReportData {
    currency: string; // 币种
    itempos: string; // 购买项位置（自定义）
    itemtype: string; // 购买项类型
    level: number; // 玩家等级
    price: number; // 购买价格（美元）
}

export interface ReportDataPurchaseClickClient extends BaseEventReportData {
    itempos: string; // 购买项位置（自定义）
    itemtype: string; // 购买项类型
    level: number; // 玩家等级
}

export interface ReportDataPurchaseFailed extends BaseEventReportData {
    currency: string; // 币种
    itempos: string; // 购买项位置（自定义）
    itemtype: string; // 购买项类型
    level: number; // 玩家等级
    price: number; // 购买价格（美元）
    purchasefailedreason: string; // 购买失败原因
}
export interface ReportDataRecharge extends BaseEventReportData {
    balance: {
        count: number; // 资产数量
        type: number; // 资产类型
    }[];
    buyContent: {
        itemcount: number; // 购买的道具数量
        itemid: number; // 购买的道具ID
    }[];
    count: number; // 购买数量
    currency: string; // 币种
    isFirstpay: boolean; // 是否首次付费
    isRepair: boolean; // 是否补单
    itemId: number; // 购买项ID
    itemPos: string; // 购买项位置（自定义）
    itemType: string; // 购买项类型
    level: number; // 玩家等级
    orderId: string; // 订单号
    price: number; // 购买价格（美元）
    time: number; // 时间戳
    transactionId: string; // 流水号
    isTest: boolean; // 是否测试
}

export interface ReportDataFirstFillAdInfoI extends BaseEventReportData {
    adunit_format: string; // 字符串
    adunit_name: string; // 字符串
    level: number; // 数值
    network_name: string; // 字符串
    revenue: number; // 数值
}
export interface ReportDataFirstFillAdInfoV extends BaseEventReportData {
    adunit_format: string; // 字符串
    adunit_name: string; // 字符串
    level: number; // 数值
    network_name: string; // 字符串
    revenue: number; // 数值
}

export interface ReportData7DaysLoginGift extends BaseEventReportData {
    level: number; // 数值
    layoutid: number; // 关卡ID	数值
    loginReward: { // 7日登录奖励
        type: string; // 7日登录奖励类型	字符串
        count: number; // 7日登录奖励数量	数值
    }[];
    loginGiftTimes: number; // 累登奖励领取次数	数值
}

export interface ReportDataLuckySpin extends BaseEventReportData {
    level: number; // 数值
    layoutid: number; // 关卡ID	数值
    spinType: string; // 转盘类型	字符串	免费：free；广告：adswheel
    spinReward: { // 转盘奖励
        type: string; // 转盘奖励类型	字符串
        count: number; // 转盘奖励数量	数值
    }[];
    spinTimes: number; // 转动转盘计数	数值	上报玩家生涯内累计转盘计数
    bigWinTimes: number; // 大奖计数	数值	上报玩家生涯内获得大奖次数
}

export interface ReportDataCountdownGift extends BaseEventReportData {
    level: number; // 数值
    layoutid: number; // 关卡ID	数值
    countdownCoin: number; // 挂机礼包金币奖励数量	数值	上报玩家本轮挂机礼包金币奖励数量
    isDouble: boolean; // 奖励是否翻倍	布尔	true：是；false：否
    countdownGiftTimes: number; // 挂机礼包领奖计数	数值	上报玩家生涯内第几次领取挂机礼包
}
export interface ReportDataRateUsPush extends BaseEventReportData {
    level: number; // 当前等级（主线关卡）	数值
}
export interface ReportDataRateUsRecord extends BaseEventReportData {
    /**1：玩家点击👍/4-5星 2：玩家点击👎/1-3星 3：玩家点击关闭 */
    step: number; // 操作步骤	数值
}
export interface ReportDataNotificationAuthority extends BaseEventReportData {
    /**拒绝：reject 始终允许：allow 应用运行时允许：runtimeAllow 若无法区分始终允许和运行时允许，则上报runtimeAllow*/
    notificationStatus: 'reject' | 'allow' | 'runtimeAllow'; // 通知权限授权状态	字符串
}
export interface ReportDataAbParamUse extends BaseEventReportData {
    [key: string]: string;
}
export interface ReportDataAbTestAssign extends BaseEventReportData {
    [key: string]: string;
}
export interface ReportDataPullAbParam extends BaseEventReportData {
    [key: string]: string;
}
export interface ReportDataPushAbParam extends BaseEventReportData {
    [key: string]: string;
}
export interface ReportDataClickView extends BaseEventReportData {
    action: 'close' | 'click'; // 点击动作	字符串	关闭弹窗：close 点击弹窗其他按钮：click
    level: number; // 当前等级（主线关卡）	数值
    viewname: string; // 弹窗名称	字符串	读表
}